package metier;

import static org.junit.Assert.*;

import org.junit.Test;

/**
 * Teste les méthodes de la classe Tache
 * @author Yoann Lagache
 *
 */
public class TestTache {

	/**
	 * Méthode de test du constructeur et des accesseurs en lecture de la classe Tache
	 * On créé une tache et on vérifie que les accesseurs permettent de récupérer la valeur 
	 * de chaque attribut
	 */
	@Test
	public void testGet() {
		Tache uneTache = new Tache(20, "Ecrire une application", 3, 15, 144);
		assertFalse(uneTache == null);
		assertEquals(uneTache.getNumTache(), 20);
		assertEquals(uneTache.getLibelle(), "Ecrire une application");
		assertEquals(uneTache.getChargePreviJoursHomme(), 3);
		assertEquals(uneTache.getMatriculeCollaborateur(), 15);
		assertEquals(uneTache.getReferenceContrat(), 144);
	}

	/**
	 * Méthode de test de setLibelle de la classe Tache
	 * On vérifie que le libellé est bien modifié
	 */
	@Test
	public void testSetLibelle() {
		String nouveauLibelle = "Nouveau Libelle";
		Tache uneTache = new Tache(20, "Ecrire une application", 3, 15, 144);
		uneTache.setLibelle(nouveauLibelle);
		assertEquals(uneTache.getLibelle(), nouveauLibelle);
	}

	/**
	 * Méthode de test de setChargePreviJoursHomme en écriture de la classe Tache
	 * On vérifie que la charge prévisionnelle est bien modifiée
	 */
	@Test
	public void testSetChargePreviJoursHommePrenom() {
		int nouvelleChargePrevi = 8;
		Tache uneTache = new Tache(20, "Ecrire une application", 3, 15, 144);
		uneTache.setChargePreviJoursHomme(nouvelleChargePrevi);
		assertEquals(uneTache.getChargePreviJoursHomme(), nouvelleChargePrevi);
	}

	/**
	 * Méthode de test de setMatriculeCollaborateur en écriture de la classe Tache
	 * On vérifie que le matricule du collaborateur est bien modifié
	 */
	@Test
	public void testSetMatriculeCollaborateur() {
		int nouveauMatricule = 17;
		Tache uneTache = new Tache(20, "Ecrire une application", 3, 15, 144);
		uneTache.setMatriculeCollaborateur(nouveauMatricule);
		assertEquals(uneTache.getMatriculeCollaborateur(), nouveauMatricule);
	}

	/**
	 * Méthode de test de setReferenceContrat en écriture de la classe Tache
	 * On vérifie que la référence du contrat est bien modifiée
	 */
	@Test
	public void testSetReferenceContrat() {
		int nouvelleReference = 122;
		Tache uneTache = new Tache(20, "Ecrire une application", 3, 15, 144);
		uneTache.setReferenceContrat(nouvelleReference);
		assertEquals(uneTache.getReferenceContrat(), nouvelleReference);
	}

	/**
	 * Méthode de test des accesseurs en écriture de la classe Tache
	 * On vérifie qu'une tache avec les memes attributs est bien "egale" a une autre,
	 * et on vérifie que le changement d'un seul paramètre rend cette egalité fausse
	 */
	@Test
	public void testEquals() {
		Tache uneTache = new Tache(20, "Ecrire une application", 3, 15, 144);
		Tache uneAutreTache = new Tache(20, "Ecrire une application", 3, 15, 144);
		assertTrue(uneTache.equals(uneAutreTache));
		uneAutreTache = new Tache(19, "Ecrire une application", 3, 15, 144);
		assertFalse(uneTache.equals(uneAutreTache));
		uneAutreTache = new Tache(20, "Ecrire une appli", 3, 15, 144);
		assertFalse(uneTache.equals(uneAutreTache));
		uneAutreTache = new Tache(20, "Ecrire une application", 4, 15, 144);
		assertFalse(uneTache.equals(uneAutreTache));
		uneAutreTache = new Tache(20, "Ecrire une application", 3, 16, 144);
		assertFalse(uneTache.equals(uneAutreTache));
		uneAutreTache = new Tache(20, "Ecrire une application", 3, 15, 145);
		assertFalse(uneTache.equals(uneAutreTache));
	}

	/**
	 * Méthode de test de la représentation en chaine des instances de la classe Tache
	 * On vérifie que la chaine produite donne bien toutes les informations sur la tache
	 */
	@Test
	public void testToString() {
		Tache uneTache = new Tache(20, "Ecrire une application", 3, 15, 144);
		String msg = "20 Ecrire une application 3 15 144";
		assertEquals(uneTache.toString(), msg);
	}

	/**
	 * Méthode de test de la représentation en chaine des instances de la classe Tache
	 * On vérifie que la chaine produite donne bien toutes les informations sur la tache,
	 * avec le descriptif
	 */
	@Test
	public void testToStringDescriptif() {
		Tache uneTache = new Tache(20, "Ecrire une application", 3, 15, 144);
		String msg = "numero : 20\nlibelle : Ecrire une application\n" +
				"charge previsionnelle jours homme : 3\nmatricule collaborateur : 15\n" +
				"reference contrat : 144";
		assertEquals(uneTache.toStringDescriptif(), msg);
	}
}
